home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / zmc3v078 / zmc3v078.lzh / SRCSV078.LZH / SWITCH.C < prev    next >
C/C++ Source or Header  |  1999-04-24  |  5KB  |  218 lines

  1. /* ================
  2.      switch
  3.    ================ */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include "config.h"
  9. #include "etc.h"
  10. #include "68lib.h"    /* strlwr */
  11. #include "zmc3.h"
  12.  
  13. #define SET_VAL    -2
  14. #define RES_VAL    -1
  15. int getSwitch(int argc,char **argv);
  16. int getSwitchVal(char letter);
  17. void setSwitchVal(char letter,char num);
  18. char *getInFile(void);
  19. char *getOutFile(void);
  20. char *setInFile(char *filename);
  21. char *setOutFile(char *filename);
  22.  
  23. #ifndef WARNLVL
  24.     #define WARNLVL    3
  25. #endif
  26.  
  27.  
  28.  
  29. const int getnum(char **ptr);
  30. void swerr(void);
  31.  
  32. #ifndef UNIXY_OS
  33.     #ifndef X68000
  34.         #include <io.h>
  35.     #else
  36.         #include <unistd.h>
  37.     #endif
  38. #endif
  39.  
  40. static WORD swtbl[26] = {    RES_VAL,RES_VAL,RES_VAL,RES_VAL,RES_VAL,
  41.                         /*  A       B       C       D      E        */
  42.                             RES_VAL,RES_VAL,RES_VAL,RES_VAL,RES_VAL,
  43.                         /*  F       G       H       I      J        */
  44.                             RES_VAL,1,      RES_VAL,RES_VAL,RES_VAL,
  45.                         /*  K       L       M       N      O        */
  46.                             RES_VAL,RES_VAL,RES_VAL,RES_VAL,RES_VAL,
  47.                         /*  P       Q       R       S      T        */
  48.                             RES_VAL,3      ,WARNLVL,RES_VAL,RES_VAL,1};
  49.                         /*  U       V       W       X      Y        Z */
  50. static char infile[2049], outfile[2049];
  51.  
  52.  
  53.  
  54. /* ==========================
  55.      get command line
  56.    ========================== */
  57.  
  58. int getSwitch(int argc,char **argv)
  59. {
  60.     infile[0] = outfile[0] = '\0';
  61.  
  62.     if (argc == 1) {
  63.  
  64. #ifdef UNIXY_OS
  65.         strcpy(infile,"-");
  66.         setSwitchVal('c',SET_VAL);
  67. #else
  68.         return 1;
  69. #endif
  70.     }
  71.  
  72.     while (--argc > 0) {
  73.         char opt[2049];
  74.         if ( strlen(*++argv) > 2048 ) {
  75.             fprintf( stderr,"Warning: too long switches.\n");
  76.         }
  77.         strcpy( opt,*argv );
  78. #ifdef UNIXY_OS
  79.         if ( opt[0]=='-' ) {
  80. #else
  81.         if ( opt[0]=='-' || opt[0]=='/' ) {
  82. #endif
  83.             char *ptr = strlwr(opt);
  84.             ptr++;
  85.             if (!*ptr) {                        /* use standard input */
  86.                 if (!infile[0]) {
  87.                     infile[0] = '-';
  88.                     infile[1] = '\0';
  89.                 } else {
  90.                     fatal(TOOMANYFILES,"Error: too many sources are specified.\n");
  91.                 }
  92.             }
  93.             while (*ptr) {
  94.                 char ch = *ptr;
  95.                 if (ch == '?') {
  96.                     help(0,0);
  97.                 } else if (!isalpha(ch)) {
  98.                     fatal(SWERR,"Error: %c: it's a invalid switch.\n",ch);
  99.                 } else {
  100.                     if (ch == 'o') {            /* destination filename will be specified */
  101.                         if (*++ptr) {
  102.                             strcpy(outfile,ptr);
  103.                             while (*ptr) ptr++;
  104.                         } else if (--argc) {
  105.                             strcpy(outfile,*++argv);
  106.                             /* argv++; */
  107.                             /* argc--; */
  108.                         } else {
  109.                             fatal(SWERR,"Error: -o: no ZMD file specified.\n");
  110.                         }
  111.                         break;
  112.                     } else if (ch == 'e') {    /* ERROR filename will be specified */
  113.                         FILE *fp;
  114.                         if (*++ptr) {
  115.                             fp = freopen(ptr,"w",stderr);
  116.                             if (fp == (FILE*)NULL) {
  117.                                 fatal(SWERR,"Error: -e: failed to redirect.\n");
  118.                             }
  119.                             while (*ptr) ptr++;
  120.                         } else if (--argc) {
  121.                             fp = freopen(*++argv,"w",stderr);
  122.                             if (fp == (FILE*)NULL) {
  123.                                 fatal(SWERR,"Error: -e: failed to redirect.\n");
  124.                             }
  125.                         } else {
  126.                             fatal(SWERR,"Error: -e: no output file specified.\n");
  127.                         }
  128.                         break;
  129.                     } else if ( isdigit((int)*++ptr) ) {
  130.                         setSwitchVal(ch, getnum(&ptr));
  131.                     } else {
  132.                         setSwitchVal(ch, SET_VAL);
  133.                     }
  134.                 }
  135.             }
  136.         } else {
  137.             if (!infile[0]) {
  138.                 strcpy(infile,opt);
  139.             } else {
  140.                 fatal(TOOMANYFILES,"Error: too many sources are specified.\n" );
  141.             }
  142.         }
  143.     }
  144.     return 0;
  145. }
  146.  
  147.  
  148.  
  149. /* ==============================
  150.      pick up numerics
  151.    ============================== */
  152.  
  153. const int getnum(char **ptr)
  154. {
  155.     int n = 0;
  156.  
  157.     if (!**ptr) {
  158.         swerr();
  159.     }
  160.     while ( isdigit((int)**ptr) ) {
  161.         n = n * 10 + (**ptr) - '0';
  162.         (*ptr)++;
  163.     }
  164.     if (n < 0) swerr();
  165.     return n;
  166. }
  167.  
  168.  
  169. /* ==================================
  170.      numeric err 
  171.    ================================== */
  172.  
  173. void swerr(void)
  174. {
  175.     fprintf( stderr,"invalid number.\n" );
  176.     help(1,0);
  177. }
  178.  
  179.  
  180. /* ===================================
  181.      return specified switch's value
  182.    =================================== */
  183.    
  184. int getSwitchVal(char letter)
  185. {
  186.     letter |= 0x20;
  187.  
  188.     return swtbl[ letter - 'a' ];
  189. }
  190.  
  191. void setSwitchVal(char letter,char num)
  192. {
  193.     letter |= 0x20;
  194.  
  195.     swtbl[ letter - 'a' ] = num;
  196. }
  197.  
  198.  
  199.  
  200. char *getInFile(void)
  201. {
  202.     return infile;
  203. }
  204.  
  205. char *getOutFile(void)
  206. {
  207.     return outfile;
  208. }
  209.  
  210. char *setInFile(char *filename)
  211. {
  212.     return strcpy(infile,filename);
  213. }
  214. char *setOutFile(char *filename)
  215. {
  216.     return strcpy(outfile,filename);
  217. }
  218.